<?php
declare(strict_types=1);

namespace plugin\ky_black\app\admin\validate;

use think\Validate;
use plugin\ky_black\app\admin\model\BlackCard;

class BlackCardValidate extends Validate
{
    protected $rule = [
        'card_no' => 'max:32|checkUnique',
        'card_type' => 'require|in:personal,organization',
        'user_id' => 'requireIf:card_type,personal|integer|gt:0',
        'org_id' => 'requireIf:card_type,organization|integer|gt:0',
        'status' => 'in:0,1,2',
        'daily_limit' => 'float|egt:0',
        'monthly_limit' => 'float|egt:0',
        'effect_time' => 'date'
    ];

    protected $message = [
        'card_no.max' => '卡号最多32个字符',
        'card_no.checkUnique' => '卡号已存在',
        'card_type.require' => '卡片类型不能为空',
        'card_type.in' => '卡片类型不正确',
        'user_id.requireIf' => '个人会员卡必须选择用户',
        'user_id.integer' => '用户ID必须是整数',
        'user_id.gt' => '用户ID必须大于0',
        'org_id.requireIf' => '机构卡必须选择机构',
        'org_id.integer' => '机构ID必须是整数',
        'org_id.gt' => '机构ID必须大于0',
        'daily_limit.float' => '日限额必须是数字',
        'daily_limit.egt' => '日限额必须大于等于0',
        'monthly_limit.float' => '月限额必须是数字',
        'monthly_limit.egt' => '月限额必须大于等于0',
        'status.in' => '状态值不正确',
        'effect_time.date' => '生效时间格式不正确'
    ];

    protected $scene = [
        'create' => ['card_no', 'card_type', 'user_id', 'org_id', 'daily_limit', 'monthly_limit', 'status', 'effect_time'],
        'edit' => ['card_type', 'user_id', 'org_id', 'daily_limit', 'monthly_limit', 'status', 'effect_time']
    ];

    /**
     * 自定义唯一性验证
     */
    protected function checkUnique($value, $rule, $data = [])
    {
        if (empty($value)) {
            return true;
        }

        error_log("Checking uniqueness for card_no: " . $value);
        
        // 检查是否存在相同卡号
        $exists = BlackCard::where('card_no', $value)->exists();
        
        error_log("Card exists in database: " . ($exists ? 'true' : 'false'));
        
        return !$exists;
    }

    /**
     * 重写验证方法，添加调试信息
     */
    public function check($data, $rules = [], $scene = '')
    {
        error_log("Validating data: " . json_encode($data));
        $result = parent::check($data, $rules, $scene);
        if (!$result) {
            error_log("Validation failed: " . $this->getError());
        }
        return $result;
    }
} 